Front_End Interview
名词解释
JS
ES 语言
- ES 语言是一门面向对象的编程语言,其主要用于在宿主环境中执行计算和操作可计算的对象。
- ES 语言是基于对象的:基本的语言和宿主设施都由对象提供,并且 ES 程序是一组可通信的对象。
ES 语言类型
- ES 语言类型对应于那些能够被 ES 程序员所直接操作的值。ES 语言类型包括 Undefined、Null、Boolean、String、Symbol、Number 和 Object。
ES 语言值
- 是一个被 ES 语言类型特征化的值。
类型
- 数据的集合。
类型转换
原始值
- Undefined,Null,Boolean,Number,Symbol 或 String 类型之一的成员。
- 原始值可以直接表示语言实现的最底层数据。
Undefined 类型
- 唯一值是 undefined 的类型。
undefined 值
- 一个没有被分配值的变量的原始值。
Null 类型
- 唯一值是 null 的类型。
null 值
- 代表对象值故意留空的一个原始值。
Boolean 类型
- 表示逻辑实体,由原始值 true 和 false 组成的类型。
Boolean 对象
- Object 类型的成员,是标准内置构造器 Boolean 的一个实例。
- 通过使用 new 表达式,以一个 Boolean 值作为参数调用 Boolean 构造器来创建 Boolean 对象。由此产生的对象包含一个值为此 Boolean 值的内部属性。
- 一个 Boolean 对象可以被强制转换为一个 Boolean 值。
Boolean 值
- Boolean 类型的成员,只有两个布尔值 true 和 false。
String 类型
- 所有可能的字符串值的集合。
- 由零个或多个(最多有 253-1 个)16 位无符号整数值(“元素”)组成的,所有有序序列的集合。
String 对象
- Object 类型的成员,是标准内置构造器 String 的一个实例。
- 通过使用 new 表达式,以一个 String 值为参数调用 String 构造器来创建 String 对象。由此产生的对象包含一个值为此 String 值的内部属性。
- 把 String 构造器作为一个函数来调用时,可以将一个 String 对象强制转换为一个 String 值。
String 值
- 原始值,它是零个或多个 16 位无符号整数组成的有限有序序列。
Number 类型
- 所有可能的数值的集合,包括特殊的 "Not-a-Number" (NaN) 值、正无穷和负无穷。
- 对于 ES 代码而言,NaN 值相互之间无法区别。
Number 对象
- Object 类型的成员,是标准内置构造器 Number 的一个实例。
- 通过使用 new 表达式,以一个数字值为参数调用 Number 构造器来创建数字对象。由此产生的对象包含一个值为此数值的内部属性。
- 把 Number 构造器作为一个函数来调用时,可以将一个 Number 对象强制转换为一个数值。
Number 值
- 原始值,对应一个双精度 64 位二进制格式的 IEEE754 值。
- Number 值是 Number 类型的一个成员,可作为一个数字的直接表示。
Infinity
- 数值,即正无穷数值(并非数学意义上的无穷大)。
NaN
- 数值,即一个 IEEE 754-2008 “Not-a-Number” 值。
Symbol 类型
- 所有可能的符号值的集合。
Symbol 对象
- Object 类型的成员,即标准内置构造器 Symbol 的一个实例。
Symbol 值
- 原始值,用来表示一个对象的唯一的属性键(不是字符串类型)。
- 每个可能的 Symbol 值都是唯一的且不可改变的。
函数
- Object 类型的成员,即标准内置构造器 Function 的一个实例,并且可作为一个子程序被调用。
- 函数是可调用的对象。
- 一个函数除了拥有它的属性外,还包含可执行代码、状态,用来确定被调用时的行为。函数的代码可以是用 ES 写的,也可以不是。
内置对象
- 全局对象
- 用于 ES 语言运行时语义的基础对象(包括 Object、Function、Boolean、Symbol 和各种 Error 对象)
- 表示和操作数值的对象(包括 Math、Number 和 Date)
- 用于文本处理的对象(String 和 RegExp)
- 索引值集合的对象(包括 Array 和 9 种不同类型数组的对象,它们所有的元素都具有一个特定数字的数据表示)
- 键集合的对象(Map 和 Set)
- 支持结构化数据的对象(JSON, ArrayBuffer, SharedArrayBuffer 和 DataView)
- 支持抽象控制的对象(生成器函数和 Promise),反射对象( Proxy 和 Reflect)
全局对象
- 全局对象没有 [[Construct]] 内部属性 ,不能当做构造器用 new 运算符调用。
- 全局对象没有 [[Call]] 内部属性,不能当做函数来调用。
- 全局对象的 [[Prototype]] 内部属性值是依赖于实现的。
- 全局对象的值属性
- Infinity
- NaN
- undefined
- 全局对象的函数属性
- eval ( x )
- isFinite ( number )
- isNaN ( number )
- parseFloat ( string )
- parseInt ( string, radix )
- encodeURI
- decodeURI ( encodedURI )
- decodeURIComponent ( encodedURIComponent )
- encodeURIComponent ( uriComponent )
- 全局对象的构造器属性
- Array ( . . . )
- ArrayBuffer ( . . . )
- Boolean ( . . . )
- DataView ( . . . )
- Date ( . . . )
- Error ( . . . )
- Function ( . . . )
- Map ( . . . )
- Number ( . . . )
- Object ( . . . )
- Proxy ( . . . )
- Promise ( . . . )
- RegExp ( . . . )
- Set ( . . . )
- String ( . . . )
- Symbol ( . . . )
- ...
- 全局对象的其它属性
- Atomics
- JSON
- Math
- Reflect
内置函数(内置函数对象)
- 指那些可以作为函数调用的内置对象。
- 都有一个 Function 原型对象 (其是 Function.prototype 表达式的初始值),作为其内部属性 [[Prototype]] 的值。
- 内置函数的例子如 parseInt 和 Math.exp。
内置构造器
- 属于内置函数。
- 实现了内部方法 [[Construct]]。
类
实例
对象
- 对象是内置类型 Object 的成员。
- 在 ES 语言中,对象是 0 个或多个带有特性的属性的集合,并有一个原型对象。原型可以是空值。
- 特性决定每一个属性如何被使用。
属性
- 对象的一部分,将一个键(字符串值或符号值)与一个值相关联。
- 根据属性形式的不同,其值可以直接表示为一个数据值(原始值、对象、函数对象)或间接地通过一对访问器函数来表示。
- 每一个属性属于数据属性或访问器属性的其中一种。
- 数据属性 把一个属性的值与一个 ES 语言值和一套 Boolean 属性关联起来。
- 访问器属性 把一个属性的值与一到两个访问器函数和一套 Boolean 属性关联起来。访问器函数用来储存或检索一个和属性相关联的 ES 语言值。
自身属性
- 对象直接拥有的属性。
继承属性
- 不是对象的自身属性,而是其原型对象上的属性(可以是自身原型或继承的)。
方法
- 作为属性值的函数。
- 当一个函数被作为一个对象的方法调用时,此对象将作为 this 值传递给该函数。
内置方法
- 指是一个内置函数的方法。
特性
- 用于定义属性的某些特征的内部值。
构造器
- 用于创建和初始化对象的函数对象。
- 构造器的 "prototype" 属性值是一个原型对象,它用来实现继承和共享属性。
原型
- 为其他对象提供共享属性的对象。
- 当构造器创建一个对象时,为了解决对象的属性引用,该对象会隐式引用构造器的 “prototype” 属性。通过程序表达式 constructor.prototype 可以引用到构造器的 “prototype” 属性。并且,添加到对象原型里的属性会通过继承的方式与所有共享此原型的对象共享。
- 另外,可使用 Object.create 内置函数,通过明确指定原型来创建一个新对象。
原型链
- 每个由构造器创建的对象都有一个隐式引用(叫做对象的原型)指向它的构造器的 "prototype" 属性。此外,原型自身可能也有一个非空隐式引用指向它自己的原型,以此类推,这就是原型链。
- 当一个引用链接到对象的属性上时,该引用会指向原型链中包含此属性名的第一个对象对应的属性。换句话说,该对象自身的同名属性会先被检查,如果该对象包含了同名的属性,引用将指向此属性;如果该对象不包含同名的属性,则下一步检查该对象的原型,以此类推。
- 一个对象原型链的长度应该是有限的(即,从任何一个对象开始,递归地对 [[GetPrototypeOf]] 方法的结果应用 [[GetPrototypeOf]] 方法,最终会指向一个值 null)。
实例化
- 实例化的过程就是拷贝构造函数属性的过程。
内置对象
- 由 ES 实现所指定和提供的对象。
浅拷贝
- 只遍历一层,如果存在嵌套,则拷贝的是引用
深拷贝
- 递归遍历,拷贝的结果是所有值都是重新分配的对象
内联函数
类数组(伪数组)
- 伪数组就是一个包含 length 属性的 json 对象,他不是一个真数组,实质都是在模拟一个集合(描述集合数据)。不具备真数组的属性和方法。
- 本质特征:即必须有 length 属性
- 其它属性键为数字型字符串
问答
JS
将伪数组转化为真数组
数组去重
[...new Set(arr)]
数组排序
用 js 实现随机选取 10–100 之间的 10 个数字,存入一个数组,并排序。
const arr = []
function getRandom(start, end) {
const range = end - start + 1
return Math.floor(Math.random() * range) + 10
}
for (let i = 0; i < 10; i++) {
arr.push(getRandom(10, 100))
}
arr.sort()
console.log(arr)ES 对象和函数的关系
将类数组对象转换为真数组
方法1
// 注意:arguments 对象需要在函数内部才能拿到 const args = Array.prototype.slice.call(arguments)
let args = [].slice.call(arguments)
方法2
let args = Array.from(arguments)
方法3
let args = [...arguments]
方法4
遍历
instanceof 和 isPrototypeOf 的区别
- a.isPrototypeOf(b) 方法用于测试一个对象 a 是否存在于另一个对象 b 的原型链上。
- 在表达式 "object instanceof AFunction"中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身,AFunction 必须是一个构造器。
浅克隆对象的方法
方法1
// 只克隆原始对象自身的值
function clone(origin) {
return Object.assign({}, origin)
}
方法2
// 克隆原始对象自身的值和其继承的值
function clone(origin) {
const originProto = Object.getPrototypeOf(origin)
return Object.assign(Object.create(originProto), origin)
}
方法1 和方法 2 缺点
// 方法1 和方法 2 缺点:无法正确拷贝 get 属性和 set 属性
const source = {
set foo(value) {
console.log(value)
}
}
const target1 = {}
Object.assign(target1, source)
console.log(Object.getOwnPropertyDescriptor(target1, 'foo'))
// {
// value: undefined,
// writable: true,
// enumerable: true,
// configurable: true
// }
上面代码中,source 对象的 foo 属性的值是一个赋值函数,Object.assign 方法将这个属性拷贝给 target1 对象,结果该属性的值变成了 undefined。这是因为 Object.assign 方法总是拷贝一个属性的值,而不会拷贝它背后的赋值方法或取值方法。
方法3
Object.getOwnPropertyDescriptors 方法配合 Object.defineProperties 方法,就可以实现正确拷贝。
const source = {
set foo(value) {
console.log(value)
}
}
const target1 = {}
Object.defineProperties(target1, Object.getOwnPropertyDescriptors(source))
console.log(Object.getOwnPropertyDescriptor(target1, 'foo'))
// {
// get: undefined,
// set: [Function: set foo],
// enumerable: true,
// configurable: true
// }方法4:推荐使用
const shallowClone = (obj) = Object.create(
Object.getPrototypeOf(obj),
Object.getOwnpropertyDesciptors(obj)
)
const cloneObj = shallowClone({a: 1})深克隆对象的方法
- JSON.parse(JSON.stringify(obj))
JS
JS 基础
if (obj.a == null) {
// 这里相当于 obj.a === null || obj.a === undefined
// 这是 jQuery 源码中推荐的写法,其他情况尽量使用 ===
}
function fn(a, b) {
// 这里也相当于 a === null || a === undefined
if (a == null) {}
}原型和原型链
如何准确判断一个变量是数组类型
let arr = []
arr instanceof Array // true
typeof arr // object typeof 是无法引用类型的详细类型的
写一个原型链继承的例子
// 仅供学习时使用,真实面试时不建议这样写,最好写一个贴近工作的例子
function Animal () {
this.eat = function () {
console.log('animal eat')
}
}
function Dog () {
this.bark = function () {
console.log('dog bark')
}
}
Dog.prototype = new Animal()
let hashiqi = new Dog()
hashiqi.bark() // 'dog bark'
hashiqi.eat() // 'animal eat'// 实战应用 -- 面试时应该是这样的类似答案
function Elem(id) {
this.elem = document.getElementById(id)
}
Elem.prototype.html = function(val) {
let elem = this.elem
if (val) {
elem.innerHTML = val
return this // 链式操作
} else {
return elem.innerHTML
}
}
Elem.prototype.on = function (type, fn) {
let elem = this.elem
elem.addEventListener(type, fn)
return this // 链式操作
}
let div1 = new Elem('detail-page')
// console.log(div1.html())
div1
.html('<p>hello interviewer</p>')
.on('click', function () {
alert('clicked')
})
.html('<p>javascript</p>')
描述 new 一个对象的过程
function Foo(name, age) {
// let this = {} // 有 new 关键字时,默认执行这一行代码
this.name = name
this.age = age
this.class = 'class-1'
// return this // 有 new 关键字时,默认执行这一行代码
}
let foo = new Foo('zhangsan', 20)zepto(或其他框架)源码中如何使用原型链
作用域和闭包
对变量提升的理解
this 的使用场景
创建 10 个 <a> 标签,点击的时候弹出来相应的序号
如何理解作用域
实际开发中闭包的应用
异步和单线程
同步和异步的区别是什么?分别举一个例子说明。
对 setTimeout 的理解
前端使用异步的场景有哪些
其他
获取 2017-06-10 格式的日期
获取随机数,要求长度是一致的字符
写一个能遍历对象和数组的通用 forEach 方法
JS-WEB-API
如何检测浏览器的类型
拆解 URL 的各部分
DOM 是哪种基本的数据结构?
DOM 操作的常用 API 有哪些?
DOM 节点的 attribute 和 property 有何区别?
事件考题
编写一个通用的事件监听函数
描述事件冒泡流程
对于一个无限下拉加载图片的页面,如何给每个图片绑定事件
手动编写一个 ajax,不依赖第三方库
跨域的几种实现方式
JS 开发环境
JS 运行环境
面试题
JS 中使用 typeof 能得到哪些类型?
考点:变量类型
扩展:变量计算
答案:
- typeof 可以区别出 7 种不同的数据类型
- typeof 只能区别值类型的数据,不能区分引用类型(函数是特例,函数的类型时 function)
- 值类型或引用类型的说法在 ES 规范中并没有体现,慎用!
| Type of val | Result |
|---|---|
| Undefined | "undefined" |
| Null | "object" |
| Boolean | "boolean" |
| Number | "number" |
| String | "string" |
| Symbol | "symbol" |
| Object (ordinary and does not implement [[Call]]) | "object" |
| Object (standard exotic and does not implement [[Call]]) | "object" |
| Object (implements [[Call]]) | "function" |
typeof undefined // 'undefined'
typeof 'abc' // 'string'
typeof 123 // 'number'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof {} // 'object'
typeof [] // 'object'
typeof null // 'object'
typeof console.log // 'function'何时使用 ===,何时使用 ==
考点:严格相等(两边操作数相等且类型相同)和不严格相等(两边操作数相等)、强制类型转换
扩展:
注意:最好避免使用 ==
答案:
if (obj.a == null) {
// 这里相等于 obj.a === null || obj.a === undefined 的简写形式
}JS 中有哪些内置函数
考点:内置函数
扩展:内置函数的作用
答案:
Object、Array、Boolean、Number、String、Symbol、Function、Date、RegExp、Error
JS 中有哪些内置对象
考点:内置函数
扩展:内置对象的作用
答案:
Math、JSON、...
JS 变量按照存储方式区分为哪些类型,并描述其特点
考点:变量类型(值类型、引用类型)
答案:
- 变量类型分为值类型和引用类型
- 值类型 - 一个变量只能对应一个内存区域,不会因为重新赋值而相互干预
- 引用类型 - 多个变量可以公用一个内存区域,会相互影响
如何理解 JSON
考点:JSON 对象、JSON 数据格式
答案:
- JSON 是 JS 中内置的一个对象,有 parse 和 stringify 两个 API
- JSON 是一种数据格式
介绍 js 的基本数据类型
number,string,boolean,object,undefinedjs有哪些内置对象?
数据封装类对象:Object、Array、Boolean、Number 和 String
其他对象:Function、Arguments、Math、Date、RegExp、Error
this对象的理解
this总是指向函数的直接调用者(而非间接调用者);
如果有new关键字,this指向new出来的那个对象;
在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window。
Javascript如何实现继承?
通过原型和构造器["1", "2", "3"].map(parseInt) 答案是多少?
[1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),其中 radix 表示解析时用的基数。map 传了 3 个 (element, index, array),对应的 radix 不合法导致解析失败。JS 中内存的生命周期以及内存是如何被回收的
- 栈内存回收类似于数组,当函数执行完后,它会自动回收,就像数组被清空一样;
- 堆内存回收利用了引用计数,即对象回收为例,每当在函数中实例化一个对象后,该对象的引用计数就会 +1,当这个实例被释放掉(如实例化该对象的函数被执行结束),该对象的引用计数就会 -1,当引用计数为 0 时,表示没有人使用这个对象了,系统就会自动对该对象做内存回收。每个在内存中的对象都会有一个引用计数。
如何创建一个对象? (画出此对象的内存图)
function Person(name, age) {
this.name = name;
this.age = age;
this.sing = function() { alert(this.name) }
}谈谈This对象的理解。
this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。
但是有一个总原则,那就是this指的是调用函数的那个对象。
this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象JavaScript原型,原型链 ? 有什么特点?
事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?
我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
事件处理机制:IE是事件冒泡、火狐是 事件捕获;
ev.stopPropagation();
什么是闭包(closure),为什么要用它?
执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在.使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源,因为say667()的内部函数的执行需要依赖say667()中的变量。这是对闭包作用的非常直白的描述.
function say667() {
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { alert(num); }
num++;
return sayAlert;
}
var sayAlert = say667();
sayAlert()//执行结果应该弹出的667"use strict";是什么意思 ? 使用它的好处和坏处分别是什么?
如何判断一个对象是否属于某个类?
使用instanceof (待完善)
if(a instanceof Person){
alert('yes');
}new操作符具体干了什么呢?
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
hasOwnPropertyJSON 的了解?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小。
{"age":"12", "name":"back"}js延迟加载的方式有哪些?
defer和async、动态创建DOM方式(用得最多)、按需异步载入js说几条写JavaScript的基本规范?
1.不要在同一行声明多个变量。
2.请使用 ===/!==来比较true/false或者数值
3.使用对象字面量替代new Array这种形式
4.不要使用全局函数。
5.Switch语句必须带有default分支
6.函数不应该有时候有返回值,有时候没有返回值。
7.For循环必须使用大括号
8.If语句必须使用大括号
9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。ajax 是什么?
jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面模块化怎么做?
[ 立即执行函数](http://benalman.com/news/2010/11/immediately-invoked-function-expression/),不暴露私有成员
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
异步加载的方式有哪些?
(1) defer,只支持IE
(2) async:
(3) 创建script,插入到DOM中,加载完毕后callBack同步和异步的区别?
如何解决跨域问题?
documen.write和 innerHTML的区别
document.write只能重绘整个页面
innerHTML可以重绘页面的一部分
.call() 和 .apply() 的区别?
例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);Jquery与jQuery UI 有啥区别?
*jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。
*jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。
提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等JQuery的源码看过吗?能不能简单说一下它的实现原理?
jquery 中如何将数组转化为json字符串,然后再转化回来?
jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
然后调用:
$("").stringifyArray(array)针对 jQuery 的优化方法?
*基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。
*频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。
比如:var str=$("a").attr("href");
*for (var i = size; i < arr.length; i++) {}
for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}JavaScript中的作用域与变量声明提升?
如何编写高性能的Javascript?
那些操作会造成内存泄漏?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)JQuery一个对象可以同时绑定多个事件,这是如何实现的?
如何判断当前脚本运行在浏览器还是node环境中?(阿里)
通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中eval是做什么的?
它的功能是把对应的字符串解析成JS代码并运行;
应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval('('+ str +')')。null,undefined 的区别?
null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。
undefined:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
null:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
写一个通用的事件侦听器函数。
// event(事件)工具集,来源:github.com/markyun
markyun.Event = {
// 页面加载完成后
readyEvent : function(fn) {
if (fn==null) {
fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = fn;
} else {
window.onload = function() {
oldonload();
fn();
};
}
},
// 视能力分别使用dom0||dom2||IE方式 来绑定事件
// 参数: 操作的元素,事件名称 ,事件处理程序
addEvent : function(element, type, handler) {
if (element.addEventListener) {
//事件类型、需要执行的函数、是否捕捉
element.addEventListener(type, handler, false);
} else if (element.attachEvent) {
element.attachEvent('on' + type, function() {
handler.call(element);
});
} else {
element['on' + type] = handler;
}
},
// 移除事件
removeEvent : function(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else if (element.datachEvent) {
element.detachEvent('on' + type, handler);
} else {
element['on' + type] = null;
}
},
// 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
stopPropagation : function(ev) {
if (ev.stopPropagation) {
ev.stopPropagation();
} else {
ev.cancelBubble = true;
}
},
// 取消事件的默认行为
preventDefault : function(event) {
if (event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
},
// 获取事件目标
getTarget : function(event) {
return event.target || event.srcElement;
},
// 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
getEvent : function(e) {
var ev = e || window.event;
if (!ev) {
var c = this.getEvent.caller;
while (c) {
ev = c.arguments[0];
if (ev && Event == ev.constructor) {
break;
}
c = c.caller;
}
}
return ev;
}
};JS 的同源策略
定时器注意问题
alert(1);
setTimeout("alert(2)",0);
alert(3);
var num = 10;
alert(num);
num = 20;
setTimeout("alert(num)",0);
num = 30;
alert(num);
var num = 10;
alert(num);
num = 20;
setTimeout("alert(num)",0);
for (var i=0;i<1000;i++){console.log(i)}
num = 30;
运算符问题
算数运算符
var a=10,b=20,c=30;
a++;
++a;
var e=++a+(++b)+(c++)+a++;
alert(e);
var a=10,b=20,c=30;
a++;
++a;
var e=++a+(++b)+(c++)+(a++);
alert(e);
逻辑运算符
console.log("a&&b a为假,则返回a;a为真,则返回b");
var a = 0&&1;
console.log(a); // 0
var b = 1&&0;
console.log(b); // 0
var c = 1&&10;
console.log(c); // 10
var d = 1 && 2 && 3;
console.log(d); // 3
var e = 0 && 1 && 2;
console.log(e); // 0
var f = 1 && 0 && 2;
console.log(f); // 0
console.log("===============");
console.log("a||b a为假,则返回b;a为真,则返回a ");
console.log(0||1); // 1
console.log(1||0); // 1
console.log(1||5); // 1
console.log(5||1); // 5
var g = 0 || 1 || 2;
console.log(g); // 1
var h = 1 || 0 || 3;
console.log(h); // 1
console.log("===============");
console.log("&& 的运算级别 比 || 高:");
var i = 3 && 0 || 2;
console.log(i); // 2
var j = 3 || 0 && 2;
console.log(j); // 3
var k = 0 || 2 && 3;
console.log(k); // 3
call 和 apply 的区别
apply()函数有两个参数:第一个参数是上下文,第二个参数是参数组成的数组。如果上下文是null,则使用全局对象代替。
如:function.apply(this,[1,2,3]);
call()的第一个参数是上下文,后续是实例传入的参数序列。
如:function.call(this,1,2,3);
事件委托是什么
闭包的理解
闭包是什么,有什么特性,对页面有什么影响
解释jsonp的原理,以及为什么不是真正的ajax
编写一个在一组数据中求最大值的函数
编写一个数组去重的方法
函数声明提升和变量声明提升问题
答案:9, 9, 9, 9, 9, 报错(Uncaught ReferenceError: a is not defined)本题考查函数声明提升和变量申明提升
关键点:函数执行时,函数内部的变量优先级高于函数外部的变量函数内部变量声明提升:只提升变量的申明,不提升变量的值var a=b=c=9; 不等于 var a=9, b=9, c=9;函数若未经调用,则函数内部定义的全局变量不能被外部访问函数体内部用 var 声明的变量,不管函数调用与否,函数体外部都不能访问未声明就被赋值的变量为全局变量
解析:
函数 f1 是一个全局函数,会被提升到代码顶部;
函数 f1 中的 var a=b=c=9;
相当于var a = 9; // 局部变量,函数 f1 调用时才会被提升到 函数内部代码顶部
b=9; // 全局变量,函数调用时才会被读取
c=9; // 全局变量,函数调用时才会被读取
var a = 9, b = 9, c = 9; 相当于var a = 9;var b = 9;var c = 9;
故图中的代码执行顺序依次是:先执行函数 f1,控制台依次输出 9,9,9
执行完函数 f1 后,该函数体内部声明的全局变量 b=9 , c=9 被暴露,可以被外部访问,而函数体内用 var 声明的局部变量不能被函数体外部访问再依次执行 console.log(c),console.log(b),console.log(a),依次输出9,9,报错(Uncaught ReferenceError: a is not defined)
原代码
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
结果
原代码
console.log(c);
console.log(b);
console.log(a);
f1();
function f1() {
var a=b=c=9;
console.log(a);
console.log(b);
console.log(c);
}
结果
原代码
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a=9,b=9,c=9;
console.log(a);
console.log(b);
console.log(c);
}
结果
console.log(c);
console.log(b);
console.log(a);
f1();
function f1() {
var a=9,b=9,c=9;
console.log(a);
console.log(b);
console.log(c);
}
结果
2. 下图中输出的结果是?
答案:undefined考查变量的优先级
关键点:函数执行时,函数内部的变量优先级高于函数外部的变量函数变量申明提升:只提升变量的申明,不提升变量的值
解析:
该段代码中全局变量有:num = 10
全局函数有:fun()在函数 fun() 中重新申明了变量 num = 20,但不在函数内部代码的头部,需要进行变量申明提升,即此时 var num; ,没有值的变量,默认值为 undefined,故调用函数的结果为 undefined
源代码
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
结果:undefined
源代码
var num = 10;
fun();
function fun() {
console.log(num);
}
结果:10
源代码
var num = 10;
fun();
function fun() {
var num = 20;
console.log(num);
}
结果:20
3.下图中输出结果是?
答案:undefined,9
源代码
var a=18;
f1();
function f1() {
var b=9;
console.log(a);
console.log(b);
var a='123';
}
结果
函数相关问题
将一个变量放在外面和放在函数中的区别
”==”和“===”的不同
函数有什么用?
简单说下你对函数的了解
简单说下你对面向对象的理解
简单说下你对原型链的理解
简述你对JS中继承的理解
网络
互联网的原理是什么?
上网的原理就是请求数据,就是文件传输。
服务器上存放着网页的相关文件,包括HTTP文件、CSS文件、JS文件、图片等。当我们打开浏览器,输入网址,我们的计算机就会对这些文件发出HTTP请求。
服务器收到请求之后,会把这些文件通过HTTP协议,传输到我们的计算机中(保存到了某个临时文件夹中)。这些文件,将在我们计算机本地的浏览器中,进行渲染、呈递。
为什么第二次打开同一个网页,会比第一次快?
什么是 HTTP 协议?
超文本传输协议,Hypertext Transfer Protocol。
这是一个文件的传输协议,我们上网的时候,所有的文件都是通过HTTP这个协议,从服务器上传输到客户的电脑里面的。
什么是网页?
什么是服务器?
什么是浏览器?
对WEB标准以及W3C的理解与认识
介绍一下你对浏览器内核的理解?
主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。
渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。
JS引擎则:解析和执行javascript来实现网页的动态效果。
最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。
浏览器
浏览器的内核分别是什么?
Cookie 的优缺点
浏览器兼容性问题
要知道典型的IE6兼容问题(面试要问),但是做项目我们兼容到IE8。
浏览器的市场占有率: http://tongji.baidu.com/data/
HTML5浏览器打分:http://html5test.com/results/desktop.html
常见兼容性问题?
png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.
浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。
IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。
浮动ie产生的双倍距离 #box{ float:left; width:10px; margin:0 0 0 100px;}
这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入 ——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
渐进识别的方式,从总体中逐渐排除局部。
首先,巧妙的使用“\9”这一标记,将IE游览器从所有情况中分离出来。
接着,再次使用“+”将IE8和IE7、IE6分离开来,这样IE8已经独立识别。css
.bb{ background-color:#f1ee18;/*所有识别*/ .background-color:#00deff\9; /*IE6、7、8识别*/ +background-color:#a200ff;/*IE6、7识别*/ _background-color:#1e0bd1;/*IE6识别*/ }IE下,可以使用获取常规属性的方法来获取自定义属性,
也可以使用getAttribute()获取自定义属性;
Firefox下,只能使用getAttribute()获取自定义属性.
解决方法:统一通过getAttribute()获取自定义属性.IE下,even对象有x,y属性,但是没有pageX,pageY属性;
Firefox下,event对象有pageX,pageY属性,但是没有x,y属性.解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。
Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示,
可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决.超链接访问过后hover样式就不出现了 被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序:
L-V-H-A : a:link {} a:visited {} a:hover {} a:active {}
选择器问题
说IE6层面兼容的: 标签选择器、id选择器、类选择器、后代、交集选择器、并集选择器、通配符。
1 p
2 #box
3 .spec
4 div p
5 div.spec
6 div,p
7 *
IE7能够兼容的:儿子选择器、下一个兄弟选择器
1 div>p
2 h3+p
IE8能够兼容的:
1 ul li:first-child
2 ul li:last-child
微型盒子问题
IE6,不支持高小于12px的盒子,任何高小于12px的盒子,在IE6中看都大
1 height: 4px;
2 _font-size: 0;
div{
width: 700px;
height: 4px;
background-color: red;
}
<body>
<div></div>
</body>
div{
width: 700px;
height: 4px;
_font-size: 0;
background-color: red;
}
IE6留了一个后门,就是只要给css属性之前,加上下划线,这个属性就是IE6认识的专有属性。
比如:
解决微型盒子,正确写法:
1 height: 10px; 2 _font-size: 0; 伴生属性。
清除浮动问题
IE6不支持用overflow:hidden;来清除浮动。
解决办法,以毒攻毒。追加一条
1 _zoom:1;
完整写法:
1 overflow: hidden; 2 _zoom:1; 伴生属性。
实际上,_zoom:1;能够触发浏览器hasLayout机制。这个机制,不要深究了,因为就IE6有。我们只需要让IE6好用,具体的实现机制,自行百度。
强调一点, overflow:hidden;的本意,就是溢出盒子的border的东西隐藏,这个功能是IE6兼容的。不兼容的是overflow:hidden;清除浮动的时候。
margin 问题
IE6双倍margin bug
当出现连续浮动的元素,携带和浮动方向相同的margin时,队首的元素,会双倍marign。
解决方案:
1)使浮动的方向和margin的方向,相反。
所以,你就会发现,我们特别喜欢,浮动的方向和margin的方向相反。并且,前端开发工程师,把这个当做习惯了。
1 float: left; 2 margin-right: 40px;
2)使用hack(没必要,别惯着这个IE6)
IE6 bug
双边距 BUG
浮动ie产生的双倍距离(IE6双边距问题:在IE6下,如果对元素设置了浮动,同时又设置了margin-left或margin-right,margin值会加倍。) #box{ float:left; width:10px; margin:0 0 0 100px;} 这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入 ——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)
png24 位的图片在 iE6 浏览器上出现背景
解决方案是做成PNG8.也可以引用一段脚本处理.
超链接 hover 点击后失效
z-index 问题
png 透明
min-height 最小高度
为什么没有办法定义 1px 左右的宽度容器
3px bug
使用float引起的 使用dislpay:inline -3px
解决办法:
不用管,因为根本就不允许用儿子踹父亲。所以,如果你出现了3px bug,说明你的代码不标准。
IE6,千万不要跟他死磕、较劲,它不配。 格调要高,老师给你讲,就是为了增加面试的成功率。不是为了让你成为IE6的专家。
HTML 面试题
什么是纯文本文件?
- 只有内容,没有样式。
- 没有语义。
- 常见的纯文本文件有:.txt、.html、.js、.css、.java。
什么是 HTML?
超文本标记语言,HyperText Markup Language,简称 HTML:即通过标签对,给纯文本增加语义。
HTML 是一种描述 Web 文档结构和语义的语言;它由元素组成,每个元素可以有一些特性。HTML 文档通过链接相互连接。网页中的内容通过 HTML 元素标记,如 <img>、<title>、<p>、<div> 等等。
- 用文本给文本增加语义,所以叫做“超文本”;
- 由于存在一对对的标签,也称为 “标记”,所以又叫做“标记语言”;
- 这些标签在网页呈现时是看不到的。
xhtml 和 html 有什么区别
- HTML 是一种基本的 WEB 网页设计语言
- XHTML 是一个基于 XML 的置标语言,语法更为严格
最主要的不同:
- XHTML 元素必须被正确地嵌套。
- XHTML 元素必须被关闭。
- 标签名必须用小写字母。
- XHTML 文档必须拥有根元素。
浏览器标准模式和怪异模式之间的区别是什么?
- 盒模型的渲染模式的不同
- 使用 window.top.document.compatMode 可显示为什么模式
Doctype 作用?标准(严格)模式与兼容(混杂)模式各有什么区别?
- DOCTYPE 声明位于 HTML 文档中的第一行,处于 <html> 标签之前。告知浏览器的解析器,用什么文档类型规范来解析这个文档。
- 该标签可声明三种 DTD 类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
- DOCTYPE 不存在或格式不正确会导致文档以兼容模式呈现。
- 标准模式的排版和 JS 运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。
HTML5 为什么只需要写 <!DOCTYPE HTML>?
- HTML5 不基于 SGML,因此不需要对 DTD 进行引用,但是需要 doctype 来规范浏览器的行为(让浏览器按照它们应该的方式来运行);
- 而HTML4.01 基于 SGML,所以需要对 DTD 进行引用,才能告知浏览器文档所使用的文档类型。
按 CSS 分:块级元素、行内(内联)元素、行内(内联)块元素
- CSS 规范规定,每个元素都有 display 属性,确定该元素的类型,每个元素都有默认的 display 值,如 div 的 display 默认值为 “block”,则为“块级”元素;span 默认 display 属性值为“inline”,是“行内”元素。
- display: none | inline | block | inline-block
- display 还有其它值:list-item | table | table-caption | table-cell | table-row | table-row-group | table-column | table-column-group | table-header-group | table-footer-group | run-in | box | flexbox | inline-flexbox | flex | inline-flex
- 块级元素
- 霸占一行,垂直方向排列,不能与其他任何元素并列
- 能接受宽、高
- 如果不设置宽度,那么宽度将默认变为父亲的100%。
- 行内块元素
- 兼容性使用(IE8 以下):display:inline-block; *display:inline; *zoom:1;
- 行内元素
- 会在水平方向排列,不能包含块级元素,与其他行内元素并排
- 不能设置宽、高,但可以设置 margin 和 padding。默认的宽度,就是文字的宽度。高度为零。
块级元素可以设置为行内元素
行内元素可以设置为块级元素
div{
display: inline;
background-color: pink;
width: 500px;
height: 500px;
}display是“显示模式”的意思,用来改变元素的行内、块级性质
inline就是“行内”。
一旦,给一个标签设置
display: inline;那么,这个标签将立即变为行内元素。此时它和一个span无异:
● 此时这个div不能设置宽度、高度;
● 此时这个div可以和别人并排了
同样的道理,
span{
display: block;
width: 200px;
height: 200px;
background-color: pink;
}“block”是“块”的意思
让标签变为块级元素。此时这个标签,和一个div无异:
● 此时这个span能够设置宽度、高度
● 此时这个span必须霸占一行了,别人无法和他并排
● 如果不设置宽度,将撑满父亲
标准流里面限制非常多,标签的性质恶心。比如,我们现在就要并排、并且就要设置宽高。在标准流内是不能实现的。
所以,移民!脱离标准流!
按 HTML 分:容器级元素、文本级元素、空(void)元素
文本级:p、span、a、b、i、u、em
容器级:div、h系列、li、dt、dd
常见的空元素:
<br> <hr> <img> <input> <link> <meta>
鲜为人知的是:<area> <base> <col> <command> <embed> <keygen> <param> <source> <track> <wbr>
h1 标签的作用?
标准答案:
<img src="../../photo/1.png" />解释:
现在document是最大的文件夹,里面有两个文件夹work和photo。work中又有一个文件夹叫做myweb。myweb文件夹里面有index.html。 所以index.html在myweb文件夹里面,上一级就是work文件夹,上两级就是document文件夹。通过document文件夹当做一个中转站,进入photo文件夹,看到了1.png。
HTML 标签的分类
HTML标签是分等级的,HTML将所有的标签分为两种:容器级、文本级。
顾名思义,容器级的标签,里面可以放置任何东西;文本级的标签里面,只能放置文字、图片、表单元素。
p 标签是一个文本级标签
p里面只能放文字、图片、表单元素等文本元素。其他的一律不能放。
HTML 文档类型声明种类
a是一个文本级的标签
title 标签
<title>出现在<head>里面,表示页面的标题。直观上,我们可以在浏览器的标题栏(标签栏)中看见。
B正确。
HTML 的本质
HTML只依靠标签对儿表达语义,和是否缩进、换行没有任何关系!只要是标签有正确的嵌套关系,正确的父子关系,那么就是一个合法的HTML结构,不一定要缩进。百度的首页,为了减小文件体积,所以都是没有缩进的。提到HTML的作用,只能从语义方面从想,绝对不能想样式。所以C错误的。D正确。
考察常用属性
1 <img src="1.jpg" />
2 <a href="1.html">点击我</a>
img是image“图像”;
src是source“资源”;
a是anchor“锚”;
href是hypertext reference“超文本地址”
考察HTTP的原理
服务器上有一些文件,html、图片、css、js文件,通过HTTP请求传输到了用户的电脑里面。所以,第二次访问的时候,这些图片就不用传输了(Ajax课上,你将知道这是HTTP 304状态),所以页面变得快。
A,错误,没有所谓的vip通路。
B,正确
C,错误。因为HTTP不是一个持久连接的协议,传完就拉倒了,就关闭连接了,
所以没有一个持续的通路。
D,错误。每次访问,都是不同的寻址过程,不会“记路”。
纯文本
用记事本打开,不是乱码,是可读的,那么一定是纯本文文件。只有文本,没有样式,没有语义。所以,.java文件是纯文本的, .class文件不是纯文本的。所有的纯文本文件都能用记事本、notepad++、editplus、sublime编辑。
考察 XHTML
所有的标签名、属性都要小写,必须使用引号,必须封闭。答案是B
考察定义列表
一定要记住每个标签标示什么,就是英语原意是什么?比如
dl 就是definition list, 定义列表;
dt 就是definition title,定义标题;
dd就是definition description,定义描述
相对路径与绝对路径
1. html中,有一个能够点击的图片。所以骨架:
<a href=""><img src="" /></a>href里面是相对路径,要从1.html出发找到2.html;
src里面也是相对路径,要从1.html出发找到kaola.png。
标准答案:
<a href="../myweb2/2.html" target="_blank"><img src="../../photo/kaola.png" /></a>
我们一直在用的是相对路径,就是从自己出发找到别人。用相对路径的好处很明显,就是站点文件夹可以拷着走。
相对路径的好处:站点不管拷贝到哪里,文件和图片的相对路径关系都是不变的。
相对路径使用有一个前提,就是网页文件和你的图片,必须在一个服务器上。
比如,你现在想插入一个新浪网上的图片,那么就不能用相对路径。就要用绝对路径。
绝对路径非常简单,所有以http://开头的路径,就是绝对路径。
1 <img src="http://i1.sinaimg.cn/dy/deco/2013/0329/logo/LOGO_1x.png" alt="" />
2 <a href="http://www.sohu.com">点击我跳转到搜狐</a>
老师,我的网页在C盘,图片却在D盘,能不能插入呢?
答案: 用相对路径不能,用绝对路径也不能。
注意,可以使用file://来插入,但是这种方法,没有任何意义!因为服务器上没有所谓c盘、d盘。
下面的方法是行的,但是没有任何工程上的意义,这是因为服务器没有盘符,linux系统没有盘符,
<img src="file://C:\Users\Danny\Pictures\明星\1.jpg" alt="" /> 总结一下:
相对路径和绝对路径。
相对路径,就是../ image/ 这种路径。从自己出发,找到别人;
绝对不允许使用file://开头的东西,这个是完全错误的!!
div 是什么?在 div 出现之前做网站用什么布局?
标签上title与alt属性的区别是什么?
H5
什么是H5?
H5为什么这么火?H5是哪一年产生的?H5会火多久?
html5 有哪些新特性
什么叫做响应式?
针对不同屏幕的响应式,UI设计师该做几套设计图?
移除了那些元素?
如何处理 HTML5 新标签的浏览器兼容问题?
IE8/IE7/IE6支持通过document.createElement方法产生的标签,
可以利用这一特性让这些浏览器支持HTML5新标签,浏览器支持新标签后,还需要添加标签默认的样式:
当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架
<!--[if lt IE 9]>
<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
<![endif]-->
如何区分 HTML 和 HTML5?
H5 新增了那些表单类型?
什么是语义化的HTML? 语义化的理解?
用正确的标签做正确的事情!
html语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析;
在没有样式CCS情况下也以一种文档格式显示,并且是容易阅读的。
搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。
使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。你如何对网站的文件和资源进行优化?期待的解决方案包括:
HTML5的离线储存?
localStorage 长期存储数据,浏览器关闭后数据不丢失;
sessionStorage 数据在浏览器关闭后自动删除。请描述一下 cookies,sessionStorage 和 localStorage 的区别?
cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage不会
sessionStorage和localStorage的存储空间更大;
sessionStorage和localStorage有更多丰富易用的接口;
sessionStorage和localStorage各自独立的存储空间;HTML5的form如何关闭自动完成功能?
给不想要提示的 form 或下某个input 设置为 autocomplete=off。如何实现浏览器内多个标签页之间的通信? (阿里)
调用localstorge、cookies等本地存储方式webSocket如何兼容低浏览器?(阿里)
Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHRiframe有那些缺点?
*iframe会阻塞主页面的Onload事件;
*iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。
使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript
动态给iframe添加src属性值,这样可以可以绕开以上两个问题。CSS 问题
CSS3有哪些新特性?
介绍一下CSS的盒子模型?
(1)有两种, IE 盒子模型、标准 W3C 盒子模型;IE的content部分包含了 border 和 pading;
(2)盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算? CSS3新增伪类有那些?
1.id选择器( # myid)
2.类选择器(.myclassname)
3.标签选择器(div, h1, p)
4.相邻选择器(h1 + p)
5.子选择器(ul > li)
6.后代选择器(li a)
7.通配符选择器( * )
8.属性选择器(a[rel = "external"])
9.伪类选择器(a: hover, li: nth - child)可继承的样式: font-size font-family color, UL LI DL DD DT;不可继承的样式:border padding margin width height ;
优先级就近原则,同权重情况下样式定义最近者为准;
载入样式以最后载入的定位为准;
优先级为:
!important > id > class > tag
important 比 内联优先级高CSS3新增伪类举例:
p:first-of-type 选择属于其父元素的首个 <p> 元素的每个 <p> 元素。
p:last-of-type 选择属于其父元素的最后 <p> 元素的每个 <p> 元素。
p:only-of-type 选择属于其父元素唯一的 <p> 元素的每个 <p> 元素。
p:only-child 选择属于其父元素的唯一子元素的每个 <p> 元素。
p:nth-child(2) 选择属于其父元素的第二个子元素的每个 <p> 元素。
:enabled :disabled 控制表单控件的禁用状态。
:checked 单选框或复选框被选中。box-sizing常用的属性有哪些?分别有什么作用?
(Q1)box-sizing: content-box|border-box|inherit;
(Q2)content-box:宽度和高度分别应用到元素的内容框。在宽度和高度之外绘制元素的内边距和边框(元素默认效果)。
border-box:元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制。通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度。
什么是 CSS Hack?
简述一下 src 与 href 的区别
px、em 和 rem 的区别
- px 像素(Pixel),绝对长度单位。像素 px 是相对于显示器屏幕分辨率而言的。(引自CSS2.0手册)
- px 是你的屏幕设备物理上能显示出的最小的一个点,这个点不是固定宽度的,不同设备上点的长宽、比例有可能会不同。假设:你现在用的显示器上 1px 宽 = 1毫米,但我用的显示器 1px 宽 = 两毫米,那么你定义一个 div 宽度为100px,你显示器上看这个 div 是10厘米,我显示器上看是20厘米。另外一个 px 点的长宽不一定是 1:1 的正方形,有的设备上长宽比是不一样的。
- 用 px 作为单位的好处来说是不管浏览器字体大小如何设置,都不会“乱套”。但是可以通过 JS 方式调整大小。
- em 尺寸,相对长度单位。所有现代浏览器下默认字体尺寸是16px,这时1em=16px。em 是一个字长,是相对的单位。相对于当前对象(相对父级)内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。(引自CSS2.0手册)。em 特点:
- 1em = 16px;
- em 尺寸:所有现代浏览器下默认字体尺寸是16px,这时 1em=16px。然后你人为的把 body 里面定义 font-size:12px;(把浏览器默认16px改小了),此刻 1em=12px,如果 0.8em 实际等于 12px*0.8;em 的用处是你要整个网页字体统一变大变小你只要改 body 里面 font-size 的值就行了。
em 相对父级,嵌套一多了算字体到底多大就很操蛋。
em 的值并不是固定的; - em 会继承父级元素的字体大小。
- rem 是 CSS3 新增的一个相对单位(root em,根 em),这个单位引起了广泛关注。
- 这个单位与 em 有什么区别呢?区别在于使用 rem 为元素设定字体大小时,仍然是相对大小,但相对的只是 HTML 根元素。这个单位可谓集相对大小和绝对大小的优点于一身,通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应。
- 目前,除了 IE8 及更早版本外,所有浏览器均已支持 rem。对于不支持它的浏览器,应对方法也很简单,就是多写一个绝对单位的声明。这些浏览器会忽略用 rem 设定的字体大小。
- 所以有了 rem(浏览器支持还不是很理想),他只相对 html 或 body 的字体尺寸(默认还是 16px,除非你自己用 font-size 定义为其他),没有了继承父级尺寸这个关系。下面就是一个例子:
p {font-size:14px; font-size:.875rem;}CSS 实现垂直水平居中
如何居中div?如何居中一个浮动元素?
给div设置一个宽度,然后添加margin:0 auto属性
div{ width:200px; margin:0 auto; }居中一个浮动元素
确定容器的宽高 宽500 高 300 的层 设置层的外边距 .div { Width:500px ; height:300px;//高度可以不设 Margin: -150px 0 0 -250px; position:relative;相对定位 background-color:pink;//方便看效果 left:50%; top:50%; }
列出display的值,说明他们的作用。position的值, relative和absolute定位原点是?
1.
block 象块类型元素一样显示。
none 缺省值。象行内元素类型一样显示。
inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。
list-item 象块类型元素一样显示,并添加样式列表标记。
2.
*absolute
生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
*fixed (老IE不支持)
生成绝对定位的元素,相对于浏览器窗口进行定位。
*relative
生成相对定位的元素,相对于其正常位置进行定位。static 默认值。没有定位,元素出现在正常的流中
*(忽略 top, bottom, left, right z-index 声明)。inherit 规定从父元素继承 position 属性的值。
CSS3有哪些新特性?
CSS3实现圆角(border-radius:8px),阴影(box-shadow:10px),
对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform)
transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
增加了更多的CSS选择器 多背景 rgba一个满屏 品 字布局 如何设计?
经常遇到的CSS的兼容性有哪些?原因,解决方法是什么?
为什么要初始化CSS样式
当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化。
最简单的初始化方法就是: *{padding: 0; margin: 0;} (不建议)
淘宝的样式初始化:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
h1, h2, h3, h4, h5, h6{ font-size:100%; }
address, cite, dfn, em, var { font-style:normal; }
code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
small{ font-size:12px; }
ul, ol { list-style:none; }
{ text-decoration:none; }
a:hover { text-decoration:underline; }
sup { vertical-align:text-top; }
sub{ vertical-align:text-bottom; }
legend { color:#000; }
fieldset, img { border:0; }
button, input, select, textarea { font-size:100%; }
table { border-collapse:collapse; border-spacing:0; }absolute的containing block计算方式跟正常流有什么不同?
position:absolute 和 float 属性的异同
position 跟 display、margin collapse、overflow、float 这些特性相互叠加后会怎么样?
对BFC规范的理解?
(W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。)css定义的权重
以下是权重的规则:标签的权重为1,class的权重为10,id的权重为100,以下例子是演示各种定义的权重值:
/*权重为1*/
div{
}
/*权重为10*/
.class1{
}
/*权重为100*/
#id1{
}
/*权重为100+1=101*/
#id1 div{
}
/*权重为10+1=11*/
.class1 div{
}
/*权重为10+10+1=21*/
.class1 .class2 div{
}
如果权重相同,则最后定义的样式会起作用,但是应该避免这种情况出现解释下浮动和它的工作原理?清除浮动的技巧
(Q1)
(1)父级div定义height。
(2)结尾处加空div标签clear:both。
(3)父级div定义伪类:after和zoom。
(4)父级div定义overflow:hidden。
(5)父级div定义overflow:auto。
(6)父级div也浮动,需要定义宽度。
(7)父级div定义display:table。
(8)结尾处加br标签clear:both。
(Q2) 比较好的是第3种方式,好多网站都这么用。
用过媒体查询,针对移动端的布局吗?
使用 CSS 预处理器吗?喜欢那个?
如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)
多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7msdisplay:inline-block 什么时候会显示间隙?(携程)
移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacingmargin 塌陷现象问题
标准文档流中,竖直方向的margin不叠加,以较大的为准。
如果不在标准流,比如盒子都浮动了,那么两个盒子之间没有塌陷现象,margin 可以叠加.
标准流:
<div>
<p class="p1"></p>
<p class="p2"></p>
</div>
*{
margin: 0;
padding: 0;
}
div{
width: 200px;
border: 10px solid red;
/*overflow: hidden;*/
}
.p1{
width: 200px;
height: 100px;
background-color: orange;
margin-bottom: 40px;
/*float: left;*/
}
.p2{
width: 200px;
height: 100px;
background-color: orange;
margin-top: 30px;
/*float: left;*/
}
非标准流:
*{
margin: 0;
padding: 0;
}
div{
width: 200px;
border: 10px solid red;
overflow: hidden;
}
.p1{
width: 200px;
height: 100px;
background-color: orange;
margin-bottom: 40px;
float: left;
}
.p2{
width: 200px;
height: 100px;
background-color: orange;
margin-top: 30px;
float: left;
}
权重问题
权重问题大总结:
1) 先看有没有选中,如果选中了,那么以(id数,类数,标签数)来计权重。谁大听谁的。如果都一样,听后写的为准。
2) 如果没有选中,那么权重是0。如果大家都是0,就近原则。
第1题:
第2题:
第3题:
第4题:
第5题:
第6题:
第7题:红色的。因为css中red写在后面。
第8题:
CSS 盒模型
题目1,说出下面盒子真实占有宽高,并画出盒模型图:
1 div{
2 width: 200px;
3 height: 200px;
4 padding: 10px 20px 30px;
5 padding-right: 40px;
6 border: 1px solid #000;
7 }真实占有宽度 = 200 + 20 + 40 + 1 + 1 = 262px
题目2,说出下面盒子真实占有宽高,并画出盒模型图:
1 div{ 2 width: 200px; 3 height: 200px; 4 padding-left: 10px; 5 padding-right: 20px; 6 padding:40px 50px 60px; 7 padding-bottom: 30px; 8 border: 1px solid #000; 9 } |
padding-left:10px; 和padding-right:20px; 没用,因为后面的padding大属性,层叠掉了他们。
强调一点,padding-left 不是padding-left-width
1 padding-left:10px; √ 2 padding-left-width:30px; × |
第3题,我现在给你盒模型图,请写出代码,试着用最最简单的方法写
width:123px;
height:123px;
padding:20px 40px;
border:1px solid red;
第4题:
width:123px;
height:123px;
padding:20px;
padding-right:40px;
border:1px solid red;
介绍一下box-sizing属性?
清除浮动的几种方式,各自的优缺点
描述 css reset 的作用和用途
CSS 引入的方式有哪些? link 和 @import 的区别是?
(1)link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
(2)页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
(3)import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;
(4)link方式的样式的权重高于@import的权重.
解释css sprites,如何使用
如何水平居中一个元素
文本级元素的水平居中
块级元素的水平居中
绝对定位元素的水平居中
相对定位元素的水平居中
浮动元素的居中
如何垂直居中一个元素
文本级元素的垂直居中
块级元素的垂直居中
父元素高度不固定
父元素高度固定
针对这种情况,要实现垂直居中,只要以下两点即可:
1)父元素line-height和height相等
2)子元素设置 vertical-align:middle;// 垂直居中对齐
display:inline|inline-block 块级元素转行级元素
注意:这里有个小细节需要注意,对于display:inline的情况,这两条就可以实现,但是有个弊端就是我们没办法给子元素设置高度(因为这时已经变成行级元素了),
所以对于有子元素有高度要求的情况下,我们可以设置 display:inline-block ,但是大多数情况下这样设置后我们会发现子元素的内容会发生偏移
这时什么原因呢?
其实,这时子元素继承了父元素的line-height属性,使子元素内容发生了偏移。解决办法也很简单,只需要给子元素同样设置一个新的line-height和height相等即可
对BFC规范的理解?
CSS 定位
绝对定位面试题:
答案:
绝对定位的参考点:(不存在已定位的父辈盒子)
如果用top描述,那么定位参考点就是页面的左上角,而不是浏览器的左上角;
如果用bottom描述,那么就是浏览器首屏窗口尺寸,对应的页面的左下角。
网站优化
如何对网站的文件和资源进行优化?期待的解决方案包括:
- 文件合并
- 文件最小化/文件压缩
- 使用CDN托管
- 缓存的使用
网络通信 -- http
GET和POST的区别?
HTTP状态码
100 Continue 继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功并且服务器创建了新的资源
202 Accepted 服务器已接受请求,但尚未处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且总是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未授权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最常见的服务器端错误。
503 Service Unavailable 服务器端暂时无法处理请求(可能是过载或维护)。
数据传送
XML和JSON的区别?
JS 字面量和 JS 对象的关系
JS 对象字面量、JSON 对象、JSON 字符串、JSON 协议、XML 协议
对象字面量表示法和 JavaScript Object Notation(JSON)是不同的。虽然他们看起来相似,不同点有:
- JSON 只允许
"property": valuesyntax形式的属性定义。属性名必须用双引号括起来。且属性定义不允许使用简便写法。 - JSON中,属性的值仅允许字符串,数字,数组,
true,false,null或其他(JSON)对象。 - JSON中,不允许将值设置为函数。
-
Date等对象,经JSON.parse()处理后,会变成字符串。 JSON.parse()不会处理计算的属性名,会当做错误抛出。
var objectLiteral = {
name: "Objector.L",
age: "24",
special: "JavaScript",
sayName: function() {
return this.name;
}
};var jsonFormat = {
"summary": "Blogs",
"blogrolls": [
{
"title": "Explore JavaScript",
"link": "http://example.com/"
},
{
"title": "Explore JavaScript",
"link": "http://example.com/"
}
]
};JSON.stringify(obj) // 将JSON转为字符串
通过eval() 函数可以将JSON字符串转化为对象
JSON.parse(string) // 将字符串转为JSON对象
XML 协议 和 JSON 协议
Node.js
node.js 的适用场景?
高并发、聊天、实时消息推送其他
做一个网页设计师或者前端工程师,平常访问学习的IT网站都有哪些?
- W3Cschool
- segmentFault
- csdn
- 知乎论坛
- 博客园
- github
- 慕课网
- 中国慕课网
切图工程师、前端工程师、UI设计师、美工、网页设计师区别是什么?
什么是前端工程师?什么是后端工程师?
什么是静态网页?什么叫做动态网页?
前端语言有哪些?后端语言有哪些?
做一个网站的团队都需要哪些人?
简述同步和异步的区别
线程与进程的区别
一个程序至少有一个进程,一个进程至少有一个线程。
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
你遇到过比较难的技术问题是?你是如何解决的?
常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
页面重构怎么操作?
列举 IE 与其他浏览器不一样的特性?
哪些常见操作会造成内存泄漏?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)。
99%的网站都需要被重构是那本书上写的?
什么叫优雅降级和渐进增强?
优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作。由于IE独特的盒模型布局问题,针对不同版本的IE的hack实践过优雅降级了,为那些无法支持功能的浏览器增加候选方案,使之在旧式浏览器上以某种形式降级体验却不至于完全失效。
渐进增强:从被所有浏览器支持的基本功能开始,逐步地添加那些只有新式浏览器才支持的功能,向页面增加无害于基础浏览器的额外样式和功能的。当浏览器支持时,它们会自动地呈现出来并发挥作用。
WEB应用从服务器主动推送Data到客户端有那些方式?
对Node的优点和缺点提出了自己的看法?
*(优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,
因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,
因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
*(缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,
而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。你有哪些性能优化的方法?
(看雅虎14条性能优化原则)。
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
(8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成(例如join查询),减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语言是无法“优化”的。http状态码有那些?分别代表是什么意思?
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。400 1、语义有误,当前请求无法被服务器理解。401 当前请求需要用户验证 403 服务器已经理解请求,但是拒绝执行它。
500-599 用于支持服务器错误。 503 – 服务不可用一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
查找浏览器缓存
DNS解析、查找该域名对应的IP地址、重定向(301)、发出第二个GET请求
进行HTTP协议会话
客户端发送报头(请求报头)
服务器回馈报头(响应报头)
html文档开始下载
文档树建立,根据标记请求所需指定MIME类型的文件
文件显示
[
浏览器这边做的工作大致分为以下几步:
加载:根据请求的URL进行域名解析,向服务器发起请求,接收文件(HTML、JS、CSS、图象等)。
解析:对加载到的资源(HTML、JS、CSS等)进行语法解析,建议相应的内部数据结构(比如HTML的DOM树,JS的(对象)属性表,CSS的样式规则等等)
}除了前端以外还了解什么其它技术么?你最最厉害的技能是什么?
你常用的开发工具是什么,为什么?
对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
1、实现界面交互
2、提升用户体验
3、有了Node.js,前端可以实现服务端的一些事情前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
参与项目,快速高质量完成实现效果图,精确到1px;
与团队成员,UI设计,产品经理的沟通;
做好的页面结构,页面重构和用户体验;
处理hack,兼容、写出优美的代码格式;
针对服务器的优化、拥抱最新前端技术。加班的看法?
加班就像借钱,原则应当是------救急不救穷平时如何管理你的项目?
先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等;
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
页面进行标注(例如 页面 模块 开始和结束);
CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css);
JS 分文件夹存放 命名以该JS功能为准的英文翻译。
图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理如何设计突发大规模并发架构?
说说最近最流行的一些东西吧?常去哪些网站?
Node.js、Mongodb、npm、MVVM、MEAN、three.js移动端(Android IOS)怎么做好用户体验?
清晰的视觉纵线、信息的分组、极致的减法、
利用选择代替输入、标签及文字的排布方式、
依靠明文确认密码、合理的键盘利用、你在现在的团队处于什么样的角色,起到了什么明显的作用?
你认为怎样才是全端工程师(Full Stack developer)?
介绍一个你最得意的作品吧?
你的优点是什么?缺点是什么?
如何管理前端团队?
最近在学什么?能谈谈你未来3,5年给自己的规划吗?
想问公司的问题?
问公司问题:
目前关注哪些最新的Web前端技术(未来的发展方向)?
前端团队如何工作的(实现一个产品的流程)?
公司的薪资结构是什么样子的?